using System;
using System.IO;
using Sce.Pss.Core;

// D2DMap XMLLite Reader created by staudi1992
// 15.05.2012

namespace RedSkies
{
	public class D2dMapLoader
	{
		int[,] map;		// Beinhaltet die Map als Array
		int width;		// Breite der Map
		int height;		// HÃ¶he der Map
		
		public D2dMapLoader (string datei)
		{
			using(StreamReader sr = new StreamReader(datei)) {	// StreamReader
				string zeile;								// Beinhaltet die ganze Zeile 
				string[] parts;								// Beinhaltet die Teile einer Zeile
				string[] partsofpart;						// Beinhaltet die Teile eines Teils
				int index = 0;								// Durchgehen eines Datenfeldes
				bool size = false;							// Gibt an, ob GrÃ¶ÃŸe gefunden wurde
				bool array = false;							// Gibt an, ob Array gefunden wurde
				int anzZeile = 0;							// Zeile des Arrays
				
				while(!size)
				{
					zeile = sr.ReadLine();
					if (zeile.Contains("<LayerWidth>"))
					{
						// LayerWidth-Zeile erreicht
						parts = zeile.Split('>');			// parts[1] beinhaltet 10</LayerWidth>
						partsofpart = parts[1].Split('<');	// partsofpart[0] beinhaltet 10
						width = Convert.ToInt32(partsofpart[0]);
						size = true;
					}
				}
				
				zeile = sr.ReadLine();
				// LayerHeight-Zeile erreicht
				parts = zeile.Split('>');			// parts[1] beinhaltet 20</LayerHeight>
				partsofpart = parts[1].Split('<');	// partsofpart[0] beinhaltet 20
				height = Convert.ToInt32(partsofpart[0]);
				
				map=new int[height, width];
				
				while(!array)
				{
					zeile = sr.ReadLine();
					if (zeile.Contains("<Layout>"))
					{
						// Beginn des Arrays erreicht
						array = true;
					}
				}
				
				while(anzZeile < height)
				{
					// Auslesen der Matrix-Zeile
					zeile = sr.ReadLine();
					parts = zeile.Split (' ');
					while (parts[index] == "" || parts[index] == null)
					{
						index++;
					}
					for (int i = 0; i < width; i++)
					{
						map[anzZeile, i] = Convert.ToInt32(parts[index + i]);
					}
					index = 0;
					anzZeile++;
				}				
			}
		}
		
		/// <summary>
		/// Gibt die Block-ID eines bestimmten Blocks zurÃ¼ck
		/// </summary>
		/// <returns>
		/// Block-ID als Integer
		/// </returns>
		/// <param name='_zeile'>
		/// Zeilennummer (1.Zeile = 1)
		/// </param>
		/// <param name='_spalte'>
		/// Spaltennummer (1.Spalte = 1)
		/// </param>
		public int GetBlockID (int _zeile, int _spalte)
		{
			return map[_zeile, _spalte];
		}
		
		/// <summary>
		/// Gibt die GrÃ¶ÃŸe der Map zurÃ¼ck
		/// </summary>
		/// <returns>
		/// Die GrÃ¶ÃŸe der Maps
		/// </returns>
		public Vector2 GetMapSize ()
		{
			return new Vector2(width, height);
		}
		
		/// <summary>
		/// Gibt Map zurück
		/// </summary>
		/// <returns>
		/// Die Map
		/// </returns>
		public int[,] GetMapData ()
		{
			return map;
		}
	}
}


